/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CRM;

import Clientes.Funcionario;
import Clientes.Cliente;
import Usuarios.Login;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Vector;


public class BancoDeDadosEstoque {
// =======================================
    // = Define os parametros para conectar no banco de dados

    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost/test?characterEncoding=ISO-8859-1";
    private static final String USUARIO = "root";
    private static final String SENHA = "lx12";
    private static BancoDeDadosEstoque bd;
    private static Connection conexao;

    public static BancoDeDadosEstoque getInstance() {
        if (bd == null) {
            bd = new BancoDeDadosEstoque();
        }

        return bd;
    }

    private BancoDeDadosEstoque() {
        abrirConexao();
    }

    private void abrirConexao() {
        try {
            Class.forName(DRIVER);

            conexao = DriverManager.getConnection(URL, USUARIO, SENHA);

            System.out.println("Conexão aberta com sucesso!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void salvaCliente(Cliente c) {
        String sql = "insert into cliente (nome,endereco,telefone,nascimento,sexo,cpf,ultima_compra,local_trabalho)"
                + " values"
                + "(?,?,?,?,?,?,?,?)";

        try {
            PreparedStatement ps = conexao.prepareStatement(sql);

            ps.setString(1, c.getNome());
            ps.setString(2, c.getEndereco());
            ps.setString(3, c.getTelefone());
            ps.setDate(4, c.getNascimento());
            ps.setString(5, c.getSexo());
            ps.setString(6, c.getCpf());
            ps.setDate(7, c.getDatadaultimacompra());
            ps.setString(8, c.getLocaldetrabalho());

            ps.execute();

            System.out.println("Cliente cadastrado com sucesso #" + c.getNome());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void salvaFuncionario(Funcionario f) {
        String sql = "insert into funcionario (nome,endereco,nascimento,sexo,cpf,telefone,contratacao,salario)"
                + " values"
                + "(?,?,?,?,?,?,?,?)";

        try {
            PreparedStatement ps = conexao.prepareStatement(sql);

            ps.setString(1, f.getNome());
            ps.setString(2, f.getEndereco());
            ps.setDate(3, f.getNascimento());
            ps.setString(4, f.getSexo());
            ps.setString(5, f.getCpf());
            ps.setString(6, f.getTelefone());
            ps.setDate(7, f.getContratacao());
            ps.setDouble(8, f.getSalario());

            ps.execute();

            System.out.println("Funcionário cadastrado com sucesso #" + f.getNome());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void salvaProduto(Produto p) {
        String sql = "insert into produto (nome,descricao,preco,qtd_disponivel,qtd_minima,valor_compra)"
                + " values"
                + "(?,?,?,?,?,?)";

        try {
            PreparedStatement ps = conexao.prepareStatement(sql);

            ps.setString(1, p.getNome());
            ps.setString(2, p.getDescricao());
            ps.setDouble(3, p.getPreco());
            ps.setInt(4, p.getQuantidadedisponivel());
            ps.setInt(5, p.getQuantidademinima());
            ps.setDouble(6, p.getValordecompra());
           

            ps.execute();

            System.out.println("Produto cadastrado com sucesso # " + p.getNome());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 public static void excluiProduto( Produto p )
    {
        try
        {
            String sql = "delete from produto where codigo = " + p.getCodigo();
            
            conexao.prepareStatement( sql ).execute();
            
            System.out.println( "Produto excluido com sucesso: " + p.getNome() );
        } 
        
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
 public static void excluiCliente( Cliente c )
    {
        try
        {
            String sql = "delete from cliente where codigo = " + c.getCodigo();
            
            conexao.prepareStatement( sql ).execute();
            
            System.out.println( "Cliente excluido com sucesso: " + c.getNome() );
        } 
        
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
  public static void excluiFuncionario( Funcionario f )
    {
        try
        {
            String sql = "delete from funcionario where codigo = " + f.getCodigo();
            
            conexao.prepareStatement( sql ).execute();
            
            System.out.println( "Funcionario excluido com sucesso: " + f.getNome() );
        } 
        
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
   public void excluiVenda( Venda v )
    {
        try
        {
            String sql = "delete from vendas where codigo_venda = " + v.getCodigo();
            
            conexao.prepareStatement( sql ).execute();
            
            System.out.println( "Venda excluida com sucesso #" + v.getCodigo() );
        } 
        
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
 public Produto buscaProduto( String nome )
    {
        Produto p = null;
        
        try
        {
            String sql = "select " + 
                            " codigo,nome,descricao,preco,qtd_disponivel,qtd_minima,valor_compra" +
                         " from " +
                            " produto " + 
                         "where nome like '%" + nome + "%'";
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                if ( rs.next() )
                {
                    p = new Produto();
                    p.setCodigo( rs.getInt( 1 ) );
                    p.setNome( rs.getString( 2 ) );
                    p.setDescricao( rs.getString( 3 ) );
                    p.setPreco( rs.getDouble( 4 ) );
                    p.setQuantidadedisponivel( rs.getInt( 5 ) );
                    p.setQuantidademinima( rs.getInt( 6 ) );
                    p.setValordecompra( rs.getDouble( 7 ) );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return p;
    }
  public Produto buscaProduto( int codigo )
    {
        Produto p = null;
        
        try
        {
            String sql = "select " + 
                            " codigo,nome,descricao,preco,qtd_disponivel,qtd_minima,valor_compra" +
                         " from " +
                            " produto " + 
                         "where codigo =" +  codigo ;
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                if ( rs.next() )
                {
                    p = new Produto();
                    p.setCodigo( rs.getInt( 1 ) );
                    p.setNome( rs.getString( 2 ) );
                    p.setDescricao( rs.getString( 3 ) );
                    p.setPreco( rs.getDouble( 4 ) );
                    p.setQuantidadedisponivel( rs.getInt( 5 ) );
                    p.setQuantidademinima( rs.getInt( 6 ) );
                    p.setValordecompra( rs.getDouble( 7 ) );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return p;
    }
  public Vector<Venda> buscaVendas()
    {
        Vector<Venda> vendas = new Vector<Venda>();
        
        try
        {
            String sql = "select " + 
                            " codigo_venda, codigoCliente,codigoProduto,quantidade,total" +
                         " from " +
                            " vendas "; //+ 
                         //"where codigoProduto =" +  codigo ;
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                while ( rs.next() )
                //if ( rs.next() )
                {
                     Venda v = new Venda();
                    v.setCodigo( rs.getInt( 1 ) );
                    v.setCodCliente( rs.getInt( 2 ) );
                    v.setCodProduto( rs.getInt( 3 ) );
                    v.setQuantidade( rs.getInt( 4 ) );
                    v.setTotal( rs.getDouble( 5 ) );
                    
                   vendas.add( v );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return vendas;
    }
  public Vector<Venda> buscaVendas( Produto p )
    {
        Vector<Venda> vendas = new Vector<Venda>();
        
        try
        {
            String sql = "select " + 
                            " codigo_venda, codigoCliente,codigoProduto,quantidade,total" +
                         " from " +
                            " vendas " + 
                         "where codigoProduto =" + p.getCodigo();
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                while ( rs.next() )
                //if ( rs.next() )
                {
                     Venda v = new Venda();
                    v.setCodigo( rs.getInt( 1 ) );
                    v.setCodCliente( rs.getInt( 2 ) );
                    v.setCodProduto( rs.getInt( 3 ) );
                    v.setQuantidade( rs.getInt( 4 ) );
                    v.setTotal( rs.getDouble( 5 ) );
                    
                   vendas.add( v );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return vendas;
    }
  
  public Vector<Produto> buscaProdutos()
    {
        Vector<Produto> listaDeProdutos = new Vector<Produto>();
        
        try
        {
            String sql = "select " + 
                            " codigo,nome,descricao,preco,qtd_disponivel,qtd_minima,valor_compra" +
                         " from " +
                            " produto ";
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                while ( rs.next() )
                //if ( rs.next() )
                {
                    Produto p = new Produto();
                    p.setCodigo( rs.getInt( 1 ) );
                    p.setNome( rs.getString( 2 ) );
                    p.setDescricao( rs.getString( 3 ) );
                    p.setPreco( rs.getDouble( 4 ) );
                    p.setQuantidadedisponivel( rs.getInt( 5 ) );
                    p.setQuantidademinima( rs.getInt( 6 ) );
                    p.setValordecompra( rs.getDouble( 7 ) );
                    
                   listaDeProdutos.add( p );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return listaDeProdutos;
    }
  public Vector<Cliente> buscaClientes()
    {
        Vector<Cliente> listaDeClientes = new Vector<Cliente>();
        
        try
        {
          
            String sql = "select " + 
                            " codigo,nome,endereco,nascimento,sexo,cpf,telefone, ultima_compra,local_trabalho" +
                         " from " +
                            " cliente ";
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                while ( rs.next() )
                //if ( rs.next() )
                {
                     Cliente c = new Cliente();
                    c.setCodigo( rs.getInt( 1 ) );
                    c.setNome( rs.getString( 2 ) );
                    c.setEndereco( rs.getString( 3 ) );
                    c.setNascimento( rs.getDate( 4 ) );
                    c.setSexo( rs.getString( 5 ) );
                    c.setCpf( rs.getString( 6 ) );
                    c.setTelefone( rs.getString( 7 ) );
                    c.setDatadaultimacompra( rs.getDate( 8 ) );
                    c.setLocalDeTrabalho( rs.getString( 9 ) );
                    
                   listaDeClientes.add( c );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return listaDeClientes;
    }
  public Vector<Funcionario> buscaFuncionarios()
    {
        Vector<Funcionario> listaDeFuncionarios = new Vector<Funcionario>();
        
        try
        {
          
            String sql = "select " + 
                            " codigo,nome,endereco,nascimento,sexo,cpf,telefone,contratacao,salario" +
                         " from " +
                            " funcionario ";
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                while ( rs.next() )
                //if ( rs.next() )
                {
                     Funcionario f = new Funcionario();
                    f.setCodigo( rs.getInt( 1 ) );
                    f.setNome( rs.getString( 2 ) );
                    f.setEndereco( rs.getString( 3 ) );
                    f.setNascimento( rs.getDate( 4 ) );
                    f.setSexo( rs.getString( 5 ) );
                    f.setCpf( rs.getString( 6 ) );
                    f.setTelefone( rs.getString( 7 ) );
                    f.setContratacao( rs.getDate( 8 ) );
                    f.setSalario( rs.getDouble( 9 ) );
                    
                   listaDeFuncionarios.add( f );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return listaDeFuncionarios;
    }
  
  public int totalVendasPorProduto (Produto p )
  {
    Vector<Venda> vendas = buscaVendas(p);
    int total = 0;
    for ( Venda v: vendas)
    {
        total+= v.getQuantidade();
    }
     
    return total;
  }
  
   public Venda buscaVenda( int codigo )
    {
        Venda v = null;
        
        try
        {
            String sql = "select " + 
                            " codigo_venda,codigoCliente,codigoProduto,quantidade,total" +
                         " from " +
                            " vendas " + 
                         "where codigo_venda = " + codigo;
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                if ( rs.next() )
                {
                    v = new Venda();
                    v.setCodigo( rs.getInt( 1 ) );
                    v.setCodCliente( rs.getInt( 2 ) );
                    v.setCodProduto( rs.getInt( 3 ) );
                    v.setQuantidade( rs.getInt( 4 ) );
                    v.setTotal( rs.getDouble( 5 ) );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return v;
    }
   public void alterarVenda( Venda v )
    {
        try
        {
            String sql = "update vendas set "
                    + "codigoProduto = ?, "
                    + "codigoCliente = ?, "
                    + "quantidade = ?, "
                    + "total = ?"
                    + " where codigo_venda = ?";
            
            PreparedStatement ps = conexao.prepareStatement( sql );
            ps.setInt( 1, v.getCodProduto() );
            ps.setInt( 2, v.getCodCliente() );
            ps.setInt( 3, v.getQuantidade() );
            ps.setDouble( 4, v.getTotal() );
            
            ps.setInt( 5, v.getCodigo() );
            
            ps.execute();
        } 
        
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    
    public void alterarProduto( Produto p )
    {
        try
        {
            String sql = "update produto set "
                    + "nome = ?, "
                    + "descricao = ?, "
                    + "preco = ?, "
                    + "qtd_disponivel = ?, "
                    + "qtd_minima = ?, "
                    + "valor_compra = ? "
                    + " where codigo = ?";
            
            PreparedStatement ps = conexao.prepareStatement( sql );
            ps.setString( 1, p.getNome() );
            ps.setString( 2, p.getDescricao() );
            ps.setDouble( 3, p.getPreco() );
            ps.setInt( 4, p.getQuantidadedisponivel() );
            ps.setInt( 5, p.getQuantidademinima() );
            ps.setDouble( 6, p.getValordecompra() );
            
            ps.setInt( 7, p.getCodigo() );
            
            ps.execute();
        } 
        
        catch (Exception e)
        {
            e.printStackTrace();
        }
   
   }
    public Cliente buscaCliente( String nome )
    {
        Cliente c = null;
        
        try
        {
            String sql = "select " + 
                            " codigo,nome,endereco,nascimento,sexo,cpf,telefone, ultima_compra,local_trabalho" +
                         " from " +
                            " cliente " + 
                         "where nome like '%" + nome + "%'";
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                if ( rs.next() )
                {
                    c = new Cliente();
                    c.setCodigo( rs.getInt( 1 ) );
                    c.setNome( rs.getString( 2 ) );
                    c.setEndereco( rs.getString( 3 ) );
                    c.setNascimento( rs.getDate( 4 ) );
                    c.setSexo( rs.getString( 5 ) );
                    c.setCpf( rs.getString( 6 ) );
                    c.setTelefone( rs.getString( 7 ) );
                    c.setDatadaultimacompra( rs.getDate( 8 ) );
                    c.setLocalDeTrabalho( rs.getString( 9 ) );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return c;
    }
     public Cliente buscaCliente( int codigo )
    {
        Cliente c = null;
        
        try
        {
            String sql = "select " + 
                            " codigo,nome,endereco,nascimento,sexo,cpf,telefone, ultima_compra,local_trabalho" +
                         " from " +
                            " cliente " + 
                         "where codigo = " + codigo ;
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                if ( rs.next() )
                {
                    c = new Cliente();
                    c.setCodigo( rs.getInt( 1 ) );
                    c.setNome( rs.getString( 2 ) );
                    c.setEndereco( rs.getString( 3 ) );
                    c.setNascimento( rs.getDate( 4 ) );
                    c.setSexo( rs.getString( 5 ) );
                    c.setCpf( rs.getString( 6 ) );
                    c.setTelefone( rs.getString( 7 ) );
                    c.setDatadaultimacompra( rs.getDate( 8 ) );
                    c.setLocalDeTrabalho( rs.getString( 9 ) );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return c;
    }
      public Funcionario buscaFuncionario( int codigo )
    {
        Funcionario f= null;
        
        try
        {
            String sql = "select " + 
                            " codigo,nome,endereco,nascimento,sexo,cpf,telefone, contratacao,salario" +
                         " from " +
                            " funcionario " + 
                         "where codigo = " + codigo ;
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                if ( rs.next() )
                {
                    f = new Funcionario();
                    f.setCodigo( rs.getInt( 1 ) );
                    f.setNome( rs.getString( 2 ) );
                    f.setEndereco( rs.getString( 3 ) );
                    f.setNascimento( rs.getDate( 4 ) );
                    f.setSexo( rs.getString( 5 ) );
                    f.setCpf( rs.getString( 6 ) );
                    f.setTelefone( rs.getString( 7 ) );
                    f.setContratacao( rs.getDate( 8 ) );
                    f.setSalario( rs.getDouble( 9 ) );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return f;
    }
    
    public void alterarCliente( Cliente c )
    {
        try
        {
            String sql = "update cliente set "
                    + "nome = ?, "
                    + "endereco = ?, "
                    + "nascimento = ?, "
                    + "sexo = ?, "
                    + "cpf = ?, "
                    + "telefone = ?, "
                    + "ultima_compra = ?, "            
                    + "local_trabalho = ? "
                    + " where codigo = ?";
            
            PreparedStatement ps = conexao.prepareStatement( sql );
            ps.setString( 1, c.getNome() );
            ps.setString( 2, c.getEndereco() );
            ps.setDate( 3, c.getNascimento() );
            ps.setString( 4, c.getSexo() );
            ps.setString( 5, c.getCpf() );
            ps.setString( 6, c.getTelefone() );
            ps.setDate( 7, c.getDatadaultimacompra() );
            ps.setString( 8, c.getLocaldetrabalho() );
            
            ps.setInt( 9, c.getCodigo() );
            
            ps.execute();
        } 
        
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public Funcionario buscaFuncionario( String nome )
    {
        Funcionario f = null;
        
        try
        {
            String sql = "select " + 
                            " codigo,nome,endereco,nascimento,sexo,cpf,telefone, contratacao,salario" +
                         " from " +
                            " funcionario " + 
                         "where nome like '%" + nome + "%'";
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                if ( rs.next() )
                {
                    f = new Funcionario();
                    f.setCodigo( rs.getInt( 1 ) );
                    f.setNome( rs.getString( 2 ) );
                    f.setEndereco( rs.getString( 3 ) );
                    f.setNascimento( rs.getDate( 4 ) );
                    f.setSexo( rs.getString( 5 ) );
                    f.setCpf( rs.getString( 6 ) );
                    f.setTelefone( rs.getString( 7 ) );
                    f.setContratacao( rs.getDate( 8 ) );
                    f.setSalario( rs.getDouble( 9 ) );
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return f;
    }
    
    public void alterarFuncionario( Funcionario f )
    {
        try
        {
            String sql = "update funcionario set "
                    + "nome = ?, "
                    + "endereco = ?, "
                    + "nascimento = ?, "
                    + "sexo = ?, "
                    + "cpf = ?, "
                    + "telefone = ?, "
                    + "contratacao = ?, "            
                    + "salario = ? "
                    + " where codigo = ?";
            
            PreparedStatement ps = conexao.prepareStatement( sql );
            ps.setString( 1, f.getNome() );
            ps.setString( 2, f.getEndereco() );
            ps.setDate( 3, f.getNascimento() );
            ps.setString( 4, f.getSexo() );
            ps.setString( 5, f.getCpf() );
            ps.setString( 6, f.getTelefone() );
            ps.setDate( 7, f.getContratacao() );
            ps.setDouble( 8, f.getSalario() );
            
            ps.setInt( 9, f.getCodigo() );
            
            ps.execute();
        } 
        
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public void salvaVenda( Venda venda )
    {
        String sql = "insert into vendas (codigoCliente,codigoProduto,quantidade,total)"
                        + " values" +
                     "(?,?,?,?)";
        
        try
        {
            PreparedStatement ps = conexao.prepareStatement( sql );
            
            ps.setInt( 1, venda.getCodCliente() );
            ps.setInt( 2, venda.getCodProduto() );
            ps.setInt( 3, venda.getQuantidade() );
            ps.setDouble( 4, venda.getTotal() );
            
            ps.execute();
            
            System.out.println( "Venda salva com sucesso!" );
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
    }
    public Login buscaLogin( String login, String senha )
    {
        Login l = null;
        
        try
        {
            String sql = "select " + 
                            "codigo,nome,login,senha" +
                         " from " +
                            " usuario " + 
                         "where login  = '" + login + "' and senha  = '" + senha + "'";
            
            ResultSet rs = conexao.createStatement().executeQuery( sql );
            
            if ( rs != null )
            {
                if ( rs.next() )
                {
                    l = new Login();
                    l.setCodigo( rs.getInt(1));
                    l.setUsuario( rs.getString( 2 ) );
                    l.setLogin( rs.getString( 3 ) );
                    l.setSenha( rs.getString( 4 ) );
                    
                }
            }
        }
        
        catch ( Exception e )
        {
            e.printStackTrace();
        }
        
        return l;
    }
}



